//
//
//
//
//
// Node.h
// 2011/08/29 @CieNET

#ifndef TX_NODE_H_
#define TX_NODE_H_

#include "Properties.h"
#include <string>


namespace TinyXML
{
	class Node 
	{
		public:
			Node(std::string id, std::string name, std::string context);
			Node(std::string id, std::string name, std::string context, Properties* property);
			~Node();

			bool ExpectChildren(void);

			Node* GetNextSibling(void);
			Node* GetChild(void);
			void SetProperties(Properties* perperty);

			Node* AddChild(Node* child);
			Node* AddNextSibling(Node* node);
			Node* AddParent(Node* node);

			std::string& GetName(void);
			std::string& GetContext(void);
			std::string GetContext(void) const;

			// const functions
			std::string GetName(void) const;
			std::string GetID(void) const;

			// Get context overload
			// Throw exception if convert failed
			//
			std::string GetContext(std::string& out) const;
			int GetContext(int& out) const;
			double GetContext(double& out) const;

			friend class Parser;
		private:

			std::string GetNodeEnd(void) const;
			std::string GetNodeStart(void) const;
			void SetEnd(const std::string& name);

		private:
			Properties* _properties;
			Node* _rightSibling;
			Node* _childs;
			Node* _parent;

			bool _bEnd;

			std::string _ID;
			std::string _name;
			std::string _context;
	};
};

#endif // TX_NODE_H_
